package main

import "fmt"

func main() {
	//  map 是一种特殊的 数据结构 ，一种元素对（pair）的无序集合
	// 在声明的时候不需要知道 map 的长度，因为 map 是可以动态增长的，未初始化的 map 的值是 nil，使用函数 len() 可以获取 map 中 pair 的数目
	// 	var mapname map[keytype]valuetype
	// mapname 为 map 的变量名。
	// keytype 为键类型。
	// valuetype 是键对应的值类型。
	var mapLit map[string]int // 声明一个 map 变量key为string类型，value为int类型
	var mapAssigned map[string]int
	mapLit = map[string]int{"one": 1, "two": 2}
	mapAssigned = mapLit

	fmt.Printf("mapLit is one is %d\n", mapLit["one"])
	fmt.Printf("mapLit is two is %d\n", mapLit["two"])
	fmt.Printf("mapLit is ten is %d\n", mapLit["ten"])

	// mapAssigned 是 mapList 的引用，对 mapAssigned 的修改也会影响到 mapLit 的值
	mapAssigned["one"] = 11
	fmt.Printf("after mapAssigned change,mapLit is one is %d\n", mapLit["one"])

	mapCreated := make(map[string]float32)
	mapCreated["key"] = 4.5
	fmt.Printf("mapCreated is key is %f\n", mapCreated["key"])

	// map 容量
	// 和数组不同，map 可以根据新增的 key-value 动态的伸缩，因此它不存在固定长度或者最大限制，但是也可以选择标明 map 的初始容量 capacity，格式如下：
	// make(map[keytype]valuetype, cap)
	mapWithCap := make(map[string]int, 10)
	fmt.Printf("mapWithCap length is %d\n", len(mapWithCap))

	// map 的值可以是任意类型，包括切片和指针等复杂数据结构
	// mp1 := make(map[int][]int)  // map 的值为切片
	// mp2 := make(map[int]*[]int) // map 的值为切片指针
	children := make(map[int][]int)
	addChild := func(parent, child int) {
		children[parent] = append(children[parent], child)
	}
	addChild(1000, 1001)
	addChild(1000, 1002)
	addChild(1000, 1003)

	fmt.Println(children[1000]) // [1001 1002 1003]
}
